package com.cloud.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

/**
 * 文件MD5对比
 */
public class FileMD5Util {

    private static final int BUFFER_SIZE = 8192;
    private static Map<String, String> fileHashes = new HashMap<>();

    // 计算文件的MD5哈希值
    public static String getFileMD5(File file) {
        try (FileInputStream fis = new FileInputStream(file)) {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead;

            while ((bytesRead = fis.read(buffer)) != -1) {
                md.update(buffer, 0, bytesRead);
            }

            byte[] digest = md.digest();
            StringBuilder sb = new StringBuilder();

            for (byte b : digest) {
                sb.append(String.format("%02x", b));
            }

            return sb.toString();
        } catch (IOException | NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }

    // 保存文件的初始MD5哈希值
    public static void saveFileHash(File file) {
        String md5 = getFileMD5(file);
        if (md5 != null) {
            fileHashes.put(file.getAbsolutePath(), md5);
        }
    }

    // 检查文件是否已更改
    public static boolean isFileChanged(File file) {
        String currentHash = getFileMD5(file);
        String storedHash = fileHashes.get(file.getAbsolutePath());

        if (currentHash == null || storedHash == null) {
            return false;
        }

        return !currentHash.equals(storedHash);
    }

    // 示例使用
    public static void main(String[] args) {

        System.out.println("-----测试创建文件的md5后缀----------");

        //首先获取文件的MD5
        File file1 = new File("D:\\Software-hty\\workspace\\springboot2\\src\\main\\java\\com\\cloud\\base\\file\\周报1.txt");
        File file2 = new File("D:\\Software-hty\\workspace\\springboot2\\src\\main\\java\\com\\cloud\\base\\file\\周报2.txt");

        String fileMD5 = getFileMD5(file1);
        System.out.println("111");
        String fileMD52 = getFileMD5(file2);
        System.out.println(fileMD5.equals(fileMD52));

//        // 保存文件的初始MD5哈希值
//        saveFileHash(file);
//
//        // 检查文件是否已更改
//        boolean isChanged = isFileChanged(file);
//        System.out.println("文件是否更改: " + isChanged);
    }
}
